package com.ceair.config;

import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.pinecone.PineconeEmbeddingStore;
import dev.langchain4j.store.embedding.pinecone.PineconeServerlessIndexConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wangbaohai
 * @ClassName EmbeddingStoreConfig
 * @description: 向量数据库配置文件
 * @date 2025年05月23日
 * @version: 1.0.0
 */
@Configuration
@RequiredArgsConstructor
public class EmbeddingStoreConfig {

    private final EmbeddingModel embeddingModel;

    @Value("${pinecone.api-key}")
    private String apiKey;

    @Value("${pinecone.index-name}")
    private String indexName;

    @Value("${pinecone.namespace}")
    private String namespace;

    @Value("${pinecone.cloud}")
    private String cloud;

    @Value("${pinecone.region}")
    private String region;

    /**
     * 创建并配置一个Pinecone嵌入存储Bean，用于文本段的存储和检索
     *
     * @return EmbeddingStore<TextSegment> 配置好的嵌入存储豆
     * @throws IllegalArgumentException 如果嵌入维度不是正整数，则抛出此异常
     */
    @Bean
    public EmbeddingStore<TextSegment> embeddingStore() {
        // 获取嵌入模型的维度
        int dimension = embeddingModel.dimension();
        // 检查维度是否为正整数，如果不是，则抛出异常
        if (dimension <= 0) {
            throw new IllegalArgumentException("Embedding dimension must be a positive integer.");
        }

        // 构建并返回一个Pinecone嵌入存储实例
        return PineconeEmbeddingStore.builder()
                .apiKey(apiKey) // 设置Pinecone API密钥
                .index(indexName) // 设置向量数据库索引名称
                .nameSpace(namespace) // 设置向量数据库命名空间
                .createIndex(PineconeServerlessIndexConfig.builder()
                        .cloud(cloud) // 设置创建索引的云类型
                        .region(region) // 设置创建索引的云区域
                        .dimension(dimension) // 设置向量维度
                        .build())
                .build();
    }

}
